/*
	魔王:“我的体液每30ml可以使你的敏感度上升20%，此时你正全身泡在我的体液中，
你身体的吸收率为0.002ml/(c㎡ .s)。据测量，你的体表面积大约为1.5㎡。
同时，我的触手每分钟可以运动40下。这种情况下，你还能撑住我的触手多久呢?”

	骑士:“哼!我的身体经过特殊改造，可以使每秒的体液渗透降低50%。
况且我在正常情况下需要约300下才能满足。我特殊的体质会使我满足之后，
对你的体液提升25%的抗性，你需要重新等待15s，期间我的敏感度不会不上升，
不会吸收体液，你的运动也对我无效。而且，你需要至少满足我七次才能使我恶堕。”

	(1)问:假设，骑士在魔王体液中浸泡15s后，魔王的触手还需要多久才能让骑士第一次满足?
	(2)问:总体需要多久才能使骑士恶堕完成?
*/
#include <iostream>
#include <cmath>
using namespace std;

float body_fluid_ml = 0;
float sensitivity = 0;
float body_area_m2 = 1.5;
float excerise_time = 0;
int satisfaction_time = 0;
int t_s = 0;
float penetration_rate = 0;		   // 渗透率 mL/s
float excerise_rate = 40.0 / 60.0; // 运动速率 s^-1
float sage_time_s = 0;			   // 贤者时间 s

/**
 * @brief 计算骑士对魔王体液的抗性。
 *
 * 该函数根据骑士满足的次数来计算其对魔王体液的抗性。
 * 抗性值等于满足次数乘以 0.25。
 *
 * @return float 计算得到的抗性值。
 */
float resistance()
{
	// 返回 0.25 乘以满足次数得到的抗性值
	return min(1.0, 0.25 * satisfaction_time);
}

int main()
{
	// 吸收率 * 面积 * 0.5的特殊身体参数
	penetration_rate = 0.002 * (body_area_m2 * 10000) * 0.5;
	printf("每秒渗透体液体积: %.2f ml/s\n", penetration_rate);

	while (satisfaction_time < 7)
	{
		t_s++;
		if (sage_time_s > 0)
		{
			// 运动冷却时间
			sage_time_s--;
			continue;
		}
		body_fluid_ml += penetration_rate; // 每秒钟增加的体液

		// 每30ml sensitivity 增加 20% * (1-抗性)
		sensitivity += (penetration_rate / 30) * 0.2 * (1 - resistance());

		excerise_time += excerise_rate * (1 + sensitivity); // 运动次数

		// 当运动次数大于等于 300 时，满足次数加一，重置运动次数
		if (excerise_time >= 300)
		{
			satisfaction_time++;
			excerise_time = 0;
			sage_time_s = 15;											   // 重置贤者时间
			sensitivity = (body_fluid_ml / 30) * 0.2 * (1 - resistance()); // 重新计算敏感度
			printf("##### 第 %d 秒, 魔王满足了骑士 %d 次, 重置运动次数和贤者时间 #####\n", t_s, satisfaction_time);
		}
		printf("第 %d 秒, 魔王的体液已渗透: %.2f ml, 骑士的敏感度: %.2f\n", t_s, body_fluid_ml, sensitivity);
		printf("\t触手运动次数 %.2f, 骑士满足次数 %d, 骑士体液抵抗率 %.2f%%\n", excerise_time, satisfaction_time, resistance() * 100);
		puts("");
	}
	printf("Congratulations! 骑士已经恶堕😈完成!");
}